/*
另一个终端用于发送信号:
先得到当前进程的pid, ps aux|grep 程序名

 
kill -SIGUSR1 4901
kill -SIGUSR2 4901
kill -SIGSEGV 4901
kill -SIGTERM 4901
kill -SIGUSR1  4901

 
解释:
第一行发送SIGUSR1，则调用信号处理函数，打印出结果。
第二，第三行分别打印对应的结果。
第四行发送一个默认处理为终止进程的信号。
但此时，但不会终止程序，由于sigsuspend遇到终止进程信号并不会返回，此时并不会打印出"已终止"，这个信号被阻塞了。当再次发送SIGURS1信号时，进程的信号阻塞恢复成默认的值(自动恢复)，因此，此时将会解除阻塞SIGTERM信号，所以进程被终止。
*/
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <stdio.h>

void myhandler(int signo);

int main()
{
	struct sigaction action;
	sigset_t sigmask;

	sigemptyset(&sigmask);
	sigaddset(&sigmask,SIGUSR1);
	sigaddset(&sigmask,SIGUSR2);
	sigaddset(&sigmask,SIGSEGV);

	action.sa_handler=myhandler;
	action.sa_mask=sigmask;
	sigaction(SIGUSR1,&action,NULL);
	sigaction(SIGUSR2,&action,NULL);
	sigaction(SIGSEGV,&action,NULL);
	sigfillset(&sigmask);
	sigdelset(&sigmask,SIGUSR1);
	sigdelset(&sigmask,SIGUSR2);
	sigdelset(&sigmask,SIGSEGV);

	while(1){
		sigsuspend(&sigmask);//不断的等待信号到来
	}
	return 0;
}
void myhandler(int signo){

	switch(signo){
		case SIGUSR1:
			printf("received sigusr1 signal.\n");
			break ;
		case SIGUSR2:
			printf("received sigusr2 signal.\n");
			break;
		case SIGSEGV:
			printf("received sigsegv signal\n");
			break;
		default:
			printf("received other signal\n");
			break;
	}
}

